package com.itheima.interceptor;

import com.alibaba.fastjson.JSONObject;
import com.itheima.pojo.MyResponseResult;
import com.itheima.utils.MyJwtUtils;
import com.itheima.utils.MyThreadLocalUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;

@Component
public class MyLoginTeceptor implements HandlerInterceptor {
    @Autowired
    private MyJwtUtils myJwtUtils;

    //该方法每次浏览器请求的时候，只要路径对上号就会执行1次，返回true代表放行，返回false代表阻止放行
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("我们自定义的spring的拦截器执行了........");
        // 2.根据请求头 Token 获取令牌
        String token = request.getHeader("Token");
        //3.校验令牌是否合法，如果合法则放行
        Map<String, Object> map = myJwtUtils.parseJwt(token);
        if (map == null){
            //说明令牌过期或不合法
            //保持前后端请求响应的规范，在这里需要创建一个统一结果对象
            MyResponseResult<Object> result = MyResponseResult.error("NOT_LOGIN");
            //把result响应给前端；（需要把对象转json）由于目前代码还没有执行controller，
            // 因此需要我们自己手动转成json，并手动响应数据
            String jsonString = JSONObject.toJSONString(result);

            response.getWriter().println(jsonString);
            return false;
        }
        //合法的情况 先使用ThreadLocal 本地线程保存一个变量，以便后续使用
        MyThreadLocalUtils.setValue(map);
        return true;
    }
}
